home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 2.toast / pc / sample code / overview / dtscpluslibrary / sources / application.cp < prev    next >
Encoding:
Text File  |  2000-09-28  |  19.0 KB  |  706 lines

  1. /*
  2.     File:        Application.cp
  3.  
  4.     Contains:    TApplication is an abstract base class, TBKApplication is a background only application class,
  5.                   TGUIApplication is a window-based user application class. TQTApplication is a QuickTime aware application
  6.                   class, TGXApplication is a Quick GX aware application class. Finally TQTAndGXApplication 
  7.                   handles both QX and QT application work.
  8.                   Application.cp contains the needed member functions for the classes defined above.
  9.  
  10.     Written by:     
  11.  
  12.     Copyright:    Copyright © 1992-1999 by Apple Computer, Inc., All Rights Reserved.
  13.  
  14.                 You may incorporate this Apple sample source code into your program(s) without
  15.                 restriction. This Apple sample source code has been provided "AS IS" and the
  16.                 responsibility for its operation is yours. You are not permitted to redistribute
  17.                 this Apple sample source code as "Apple sample source code" after having made
  18.                 changes. If you're going to re-distribute the source, we require that you make
  19.                 it clear in the source that the code was descended from Apple sample source
  20.                 code, but that you've made changes.
  21.  
  22.     Change History (most recent first):
  23.                 8/18/1999    Karl Groethe    Updated for Metrowerks Codewarror Pro 2.1
  24.                 
  25.  
  26. */
  27. // INCLUDE FILES
  28. #ifndef _APPLICATION_
  29. #include "Application.h"
  30. #endif
  31.  
  32.  
  33. // GLOBAL DATA AND FUNCTIONS
  34. TApplication* gApplication;                        // universal ptr to the framework
  35.  
  36. const short kDefaultNumMasters = 8;                // number of master pointers
  37. const OSType kAEResource = 'aedt';                // our AE binding resource
  38.  
  39. pascal OSErr AEDispatcher(AppleEvent* in,
  40.                           AppleEvent* out,
  41.                           long Command);        // AE Dispatcher
  42.  
  43.  
  44. // Global Functions
  45. pascal OSErr AEDispatcher(AppleEvent* in,
  46.                           AppleEvent* out,
  47.                           long Command)
  48. {
  49.     gApplication->DispatchAppleEvents(in, out, Command);// dispatch event back to the framework
  50.  
  51.     return noErr;
  52. }
  53.  
  54.  
  55. // _________________________________________________________________________________________________________ //
  56. // TApplication class member function implementations.
  57.  
  58. //    CONSTRUCTORS & DESTRUCTORS
  59.  
  60. #pragma segment Application 
  61. TApplication::TApplication()
  62. // Default constructor -- put together the basic environment (non-UI model).
  63. {
  64.     gApplication = this;                        // hook ptr to the global pointer
  65.  
  66.     // Default base class constructor, define fields to known initial values.
  67.     this->SetState(TApplication::kInit);        // set out first state
  68.     fSleepRegion = ::NewRgn();                    // define default sleep region for WaitNextEvent (NULL)
  69.     fSleepValue = TApplication::kBackgroundSleepValue;// default sleep value (ticks)
  70.     fEventMask = everyEvent;                    // default setting
  71.     fMoreMasters = kDefaultNumMasters;            // amount of more master calls
  72.  
  73.     this->InitializeMemory();                    // initialize memory
  74.     this->InstallAEHandler();                    // install our AE handler
  75. }
  76.  
  77.  
  78. #pragma segment Application 
  79. TApplication::~TApplication()
  80. // Default destructor -- empty for the time being.
  81. {
  82. }
  83.  
  84.  
  85. #pragma segment Application
  86. void TApplication::DoNextEvent()
  87. // Handle incoming events
  88. {
  89.     if (!::WaitNextEvent(fEventMask, &fEventRecord, fSleepValue, fSleepRegion))
  90.         fEventRecord.what = nullEvent;            // security issue
  91. }
  92.  
  93.  
  94. #pragma segment Application
  95. void TApplication::DoHighLevelEvent()
  96. // Handle high level events.
  97. {
  98.     fError = ::AEProcessAppleEvent(&fEventRecord);// handle primarly AEs
  99.     VASSERT(fError == noErr, ("Problems with AEProcessAppleEvent", fError));
  100. }
  101.  
  102. #pragma segment Application
  103. void TApplication::Start()
  104. // Start the application and let it run until we change the state to Quit.
  105. {
  106.     this->SetState(TApplication::kRun);            // set TApplication to run state
  107.  
  108.     while (fState != TApplication::kQuit)
  109.         this->DoEventLoop();
  110.     this->Quit();                                // out from the state, we will quit
  111. }
  112.  
  113.  
  114. #pragma segment Application
  115. void TApplication::Quit()
  116. // Quit the application, do any possible cleanup.
  117. {
  118. }
  119.  
  120.  
  121. //    CORE AE HANDLER METHODS
  122. #pragma segment Application
  123. void TApplication::InstallAEHandler()
  124. // Install our core Apple Event Handler that will dispatch the AEs back to the framework.
  125. {
  126.     Handle aedtResource = NULL;
  127.     SignedByte state;
  128.     Size tableSize;
  129.     AEEventTablePtr tablePtr;
  130.  
  131.     short numEntries = ::Count1Resources(kAEResource);// find out how many entries in the table
  132.     fError = ResError();
  133.     VASSERT(fError == noErr, ("Problems with Count1Resources = %d", fError));
  134.     
  135.     if(numEntries != 0)                                // we had 'aedt' resources
  136.     {
  137.         for (short i = 1; i <= numEntries; ++i)        // loop through the resources
  138.         {
  139.             aedtResource = ::Get1IndResource('aedt', i);// get resource
  140.             fError = ResError();
  141.             VASSERT(fError == noErr, ("Problems with Get1IndResource = %d", fError));
  142.             
  143.             state = ::HGetState(aedtResource);        // get the flags from the handle
  144.             ::HLockHi(aedtResource);                // and lock the handle high in memory
  145.  
  146.             tableSize = GetHandleSize(aedtResource);// get the size of the resource
  147.             fError = MemError();
  148.             VASSERT(fError == noErr, ("Problems with GetHandleSize = %d", fError));
  149.             
  150.             short elements = (short)(tableSize / sizeof(AEEventTable));// get N of elements in resource
  151.             tablePtr = (AEEventTablePtr) * aedtResource;// get ptr to the element
  152.  
  153.             // ••• Add the information into our fCommandTable as well for future lookups
  154.             for (short j = 0; j < elements; j++)    // go through the elements
  155.             {
  156.                 fError  = ::AEInstallEventHandler(tablePtr->theClass, tablePtr->theID, NewAEEventHandlerProc(AEDispatcher), tablePtr->theValue, false);
  157.                 VASSERT(fError == noErr, ("Problems with AEInstallEventHandler = %d", fError));
  158.                 ++tablePtr;
  159.             }
  160.             ::HSetState(aedtResource, state);        // restore state
  161.             ::ReleaseResource(aedtResource);        // release the resource
  162.         }
  163.     }
  164. }
  165.  
  166.  
  167. #pragma segment Application
  168. void TApplication::DispatchAppleEvents(AppleEvent* in,
  169.                                        AppleEvent* out,
  170.                                        long command)
  171. // Dispatch to the right Handler based on the command in the AE (refCon).
  172. {
  173.     switch (command)
  174.     {
  175.         case cQuitCommand:                        // a quit AE
  176.             this->HandleQuit(in, out, command);
  177.             break;
  178.         case cNewCommand:                            // a  new AE
  179.             this->HandleOpen(in, out, command);
  180.             break;
  181.         case cOpenCommand:                        // an open document AE
  182.             this->HandleOpenDocuments(in, out, command);
  183.             break;
  184.         case cPrintCommand:                        // a print AE
  185.             this->HandlePrint(in, out, command);
  186.             break;
  187.         default:                                        // hmm, something else then…
  188.             ASSERT(false, "\pProblem: We are dealing with an AE command that we have no handler for");
  189.             break;
  190.     }
  191. }
  192.  
  193.  
  194. #pragma segment Application
  195. OSErr TApplication::HandleQuit(AppleEvent*        /*in*/,
  196.                                AppleEvent*        /*out*/,
  197.                                long                /*refCon*/)
  198. // Our General Quit Handler. Set state to Quit and return.
  199. {
  200.     this->SetState(TApplication::kQuit);        // set state to Quit
  201.     return noErr;                                // need to have this due to AEHandler prototype
  202. }
  203.  
  204.  
  205. #pragma segment Application
  206. OSErr TApplication::HandleOpen(AppleEvent*        /*in*/,
  207.                                AppleEvent*        /*out*/,
  208.                                long                /*refCon*/)
  209. {
  210.     return errAEEventNotHandled;                // need to have this due to AEHandler prototype
  211. }
  212.  
  213. #pragma segment Application
  214. OSErr TApplication::HandleOpenDocuments(AppleEvent*/*in*/ ,
  215.                                         AppleEvent*/*out*/ ,
  216.                                         long    /*refCon*/)
  217. {
  218.     return errAEEventNotHandled;                // need to have this due to AEHandler prototype
  219. }
  220.  
  221. #pragma segment Application
  222. OSErr TApplication::HandlePrint(AppleEvent*        /*in*/,
  223.                                 AppleEvent*        /*out*/,
  224.                                 long            /*refCon*/)
  225. {
  226.     return errAEEventNotHandled;                // need to have this due to AEHandler prototype
  227. }
  228.  
  229.  
  230. //    STATE CHANGE METHODS
  231. #pragma segment Application
  232. void TApplication::SetState(TApplication::EState theState)
  233. {
  234.     fState = theState;
  235. }
  236.  
  237.  
  238. //    MAIN INTERFACE
  239. #pragma segment Application
  240. void TApplication::InitializeMemory()
  241. // Initialize issues dealing with memory use.
  242. {
  243.     ::MaxApplZone();                            // increase the zone
  244.     for (short i = 0; i < fMoreMasters; i++)    // bounce up the amount of master pointers
  245.         ::MoreMasters();
  246.     fError = MemError();
  247.     VASSERT(fError == noErr, ("Problems with MoreMasters = %d", fError));
  248. }
  249.  
  250.  
  251. // _________________________________________________________________________________________________________ //
  252. // TBKApplication class member function implementations
  253.  
  254. //    CONSTRUCTORS & DESTRUCTORS
  255.  
  256. #pragma segment Application 
  257. TBKApplication::TBKApplication()
  258. {
  259. }
  260.  
  261.  
  262. #pragma segment Application 
  263. TBKApplication::~TBKApplication()
  264. {
  265. }
  266.  
  267.  
  268. // _________________________________________________________________________________________________________ //
  269. // TGUIApplication class member function implementations
  270.  
  271. //    CONSTRUCTORS & DESTRUCTORS
  272.  
  273. #pragma segment Application 
  274. TGUIApplication::TGUIApplication()
  275. // Initialize the UI toolbox side.
  276. {
  277.     this->InitializeToolbox();                    // Initialize toolbox
  278.     TMenubar myMenubar;                            // handle my menu bar initialization
  279.  
  280.     fCursHandle = ::GetCursor(watchCursor);        // get the watch cursor resource
  281.     ::SetCursor(*fCursHandle);                    // change the cursor to the watch one
  282. }
  283.  
  284.  
  285. #pragma segment Application 
  286. TGUIApplication::~TGUIApplication()
  287. // Default destructor -- empty for the time being.
  288. {
  289. }
  290.  
  291.  
  292. #pragma segment Application
  293. void TGUIApplication::InitializeToolbox()
  294. // Initialize the toolbox requirements for a standard window based application.
  295. {
  296.     ::InitGraf(&qd.thePort);
  297.     ::InitFonts();
  298.     ::InitWindows();
  299.  
  300.     // _DON'T_ flush disk-inserted or os events or you'll be sorry! 
  301.     ::FlushEvents(everyEvent - diskMask - osMask, 0);
  302.  
  303.     // The following toolbox init calls are slightly overhead, but that's fine 
  304.     ::InitMenus();
  305.     ::TEInit();
  306.     ::InitDialogs(NULL);
  307.  
  308.     ::InitCursor();
  309. }
  310.  
  311. //    MAIN INTERFACE
  312. #pragma segment Application
  313. void TGUIApplication::Start()
  314. // Start the event loop handling.
  315. {
  316.     ::SetCursor(&qd.arrow);                        // OK, scursor back to to the arrow one
  317.     TApplication::Start();                        // call the inherited Start
  318. }
  319.  
  320.  
  321. //    EVENT HANDLING MEMBER FUNCTIONS
  322. #pragma segment Application
  323. void TGUIApplication::DoEventLoop()
  324. // This is the big event loop swith statement function.
  325. {
  326.     this->DoNextEvent();                        // get the next event record
  327.  
  328.     // This is the big switch statement, switch on events received
  329.     switch (fEventRecord.what)
  330.     {
  331.         case nullEvent:                            // we got a periodic null event
  332.             this->DoIdle();                        // call idle handler
  333.             break;
  334.  
  335.         case updateEvt:                            // we got an update event
  336.             this->DoWindowUpdate();                // call the window update member function
  337.             break;
  338.             
  339.         case diskEvt:                            // we got a disk insertion event (most likely formatting)
  340.             this->DoDiskEvent();
  341.             break;
  342.  
  343.         case mouseDown:                            // we got a mouse down event
  344.             // get the window where the mouse down happened, and do an action based on this
  345.             switch (::FindWindow(fEventRecord.where, &fCurrentWindow))
  346.             {
  347.                 case inSysWindow:                // It's a DA window, provide time for that.
  348.                     this->DoSystemTime();
  349.                     break;
  350.  
  351.                 case inDrag:                    // Move the window to a specific target.
  352.                     this->DoDragWindow();
  353.                     break;
  354.     
  355.                 case inGoAway:                    // Close the window.
  356.                     this->DoGoAwayWindow();        // do window close events
  357.                     // ••• Future, Send a Close command
  358.                     break;
  359.  
  360.                 case inContent:                    // handle click inside the window
  361.                     this->DoInWindowContent();
  362.                     break;
  363.  
  364.                 case inMenuBar:                    // handle menu bar clicks
  365.                     this->DoMenuCommand();
  366.                     break;
  367.                                     
  368.                 default:                        // ignore any other sane events for the time being
  369.                     break;
  370.             }
  371.  
  372.         case app4Evt:                            // we got a Multifinder event
  373.             switch ((unsigned long)fEventRecord.message >> TApplication::kHighByte)
  374.             {
  375.                 case TApplication::kSuspendResumeMessage:// suspend or deactivate message
  376.                     if ((fEventRecord.message & TApplication::kResumeMask) == 0)
  377.                         fSleepValue = TApplication::kBackgroundSleepValue;
  378.                     else                        // resume or activate message
  379.                         fSleepValue = TApplication::kForgroundSleepValue;
  380.                     break;
  381.             }
  382.             break;
  383.  
  384.         case kHighLevelEvent:
  385.             this->DoHighLevelEvent();            // handle our high level events (as AEs)
  386.             break;
  387.  
  388.         default:
  389.             break;
  390.     }
  391. }
  392.  
  393.  
  394. #pragma segment Application
  395. void TGUIApplication::DoIdle()
  396. // Handle idle time
  397. {
  398. }
  399.  
  400.  
  401. #pragma segment Application
  402. void TGUIApplication::DoSystemTime()
  403. // Handle DAs
  404. {
  405.     ::SystemClick(&fEventRecord, fCurrentWindow);
  406. }
  407.  
  408.  
  409. #pragma segment Application
  410. void TGUIApplication::DoDiskEvent()
  411. // Handle disk events (formatting, floppies inserted and so on).
  412. {
  413.     Point dlogPoint;
  414.     const short kDILeft = 40;
  415.     const short kDITop = 40;
  416.  
  417.     if (HiWrd(fEventRecord.message) != noErr)    // if no error indication
  418.     {
  419.         ::SetPt(&dlogPoint, kDILeft, kDITop);        // define the dlog box rect
  420.         fError = ::DIBadMount(dlogPoint, fEventRecord.message);// turn it over to the system
  421.         VASSERT(fError == noErr, ("Problems with DIBadMount = %d ", fError));
  422.     }
  423. }
  424.  
  425.  
  426. #pragma segment Application
  427. void TGUIApplication::DispatchAppleEvents(AppleEvent* in, AppleEvent* out, long command)
  428. // Take care of the GUI related Apple Events, and dispatch the rest to the TApplication level
  429. {
  430.     switch(command)
  431.     {
  432.         case cAboutCommand:        // Send an AE telling the system to display the About box
  433.             this->DoAboutBox();
  434.             break;
  435.         default:
  436.             TApplication::DispatchAppleEvents(in, out, command);
  437.             break;
  438.     }
  439. }
  440.  
  441.  
  442. #pragma segment Application
  443. void TGUIApplication::DoWindowUpdate()
  444. // Handle window update events.
  445. {
  446.     ::BeginUpdate((WindowPtr)fEventRecord.message);
  447.     ::SetPort((WindowPtr)fEventRecord.message);    // set port to the right grafport
  448.     this->Draw();                                            // call the window drawing part
  449.     ::EndUpdate((WindowPtr)fEventRecord.message);
  450. }
  451.  
  452.  
  453.  
  454. #pragma segment Application
  455. void TGUIApplication::DoDragWindow()
  456. // Handle the inDrag event.
  457. {
  458.     ::DragWindow(fCurrentWindow, fEventRecord.where, &qd.screenBits.bounds);
  459. }
  460.  
  461.  
  462. #pragma segment Application
  463. void TGUIApplication::DoGoAwayWindow()
  464. // Handle dogoAway events.
  465. {
  466.     ::TrackGoAway(fCurrentWindow, fEventRecord.where);
  467. }
  468.  
  469.  
  470. #pragma segment Application
  471. void TGUIApplication::DoInWindowContent()
  472. // Handle inWindow events.
  473. {
  474.     if (fCurrentWindow != ::FrontWindow())
  475.         ::SelectWindow(fCurrentWindow);            // make the window the foremost one
  476.     else
  477.         this->DoClick();                        // handle the click inside the foremost window
  478. }
  479.  
  480.  
  481.  
  482. //    MENU EVENTS
  483. #pragma segment Application
  484. void TGUIApplication::DoMenuCommand()
  485. // Handle menu mouse events.
  486. {
  487.     long aCommandNumber;
  488.  
  489.     this->AdjustUserInterface();                // first, make sure the menu entries are enabled/disabled
  490.  
  491.     fMenuResult = ::MenuSelect(fEventRecord.where);// get the selected menu (longword)    
  492.  
  493.     aCommandNumber = this->CalculateMenuCommand(fMenuResult);    // calculate our command number
  494.  
  495.     // We will handle the most typical menu entries here (Apple, Edit, File)
  496.     // and call DoCommand() with the rest of the possible commands.
  497.  
  498.     this->DoInternalMenus(aCommandNumber);        // handle internal menus (Apple)
  499.     this->DoCommand(aCommandNumber);            // handle external commands/menus
  500.  
  501.     ::HiliteMenu(0);                            // unhighlight what MenuSelect hilited and return
  502. }
  503.  
  504.  
  505. #pragma segment Application
  506. long TGUIApplication::CalculateMenuCommand(long menuEntry)
  507. // Calculate the command number based on the algorithm where the menu entry
  508. // is either a two-digit or a three-digit number, and where the first number
  509. // is the menu number.
  510. {
  511.     long command;
  512.     if (LoWrd(menuEntry) > 9)                    // use algorithm 2
  513.     {
  514.         command = (HiWrd(menuEntry) * 100) + LoWrd(menuEntry);
  515.     }
  516.     else                                                // use algorithm 1
  517.         command = (HiWrd(menuEntry) * 10) + LoWrd(menuEntry);
  518.     
  519.     return command;
  520. }
  521.  
  522.  
  523. #pragma segment Application
  524. void TGUIApplication::DoInternalMenus(long command)
  525. // Handle our internal menus, Apple, DAs and so on.
  526. {
  527.     Str255 daName;                                // our DA name
  528.     short daRefNum;                                // our DA refnum 
  529.  
  530.     switch (command)
  531.     {
  532.         case cAboutCommand:                        // our About box?
  533.             fMessenger.Send(kCoreEventClass, kAEAbout);
  534.             break;
  535.  
  536.         default:
  537.             if( HiWrd(fMenuResult) == mApple) // we have a DA?
  538.             {
  539.                 ::GetMenuItemText(GetMenuHandle(mApple), (short)LoWrd(fMenuResult), daName);
  540.                 daRefNum = ::OpenDeskAcc(daName);
  541.             }
  542.             break;
  543.     }
  544. }
  545.  
  546.  
  547. #pragma segment Application
  548. void TGUIApplication::DoCommand(long command)
  549. // Handle the default framework menus, post AE commands.
  550. {
  551.     switch(command)
  552.     {
  553.         case cQuitCommand:
  554.             fMessenger.Send(kCoreEventClass, kAEQuitApplication);
  555.             break;
  556.         
  557.         default:
  558.             TApplication::DoCommand(command);                    // let the underlying framework take a short
  559.             break;
  560.     }
  561. }
  562.  
  563.  
  564. //  AE HANDLING OVERRIDES
  565. #pragma segment Application
  566. OSErr TGUIApplication::HandleOpen(AppleEvent*        /*in*/,
  567.                                AppleEvent*            /*out*/,
  568.                                long                    /*refCon*/)
  569. {
  570.     this->DoCreateDocument();                    // Default behavior -- open one window ('document').
  571.     return noErr;                                // need to have this due to AEHandler prototype
  572. }
  573.  
  574.  
  575. //    DOCUMENT CREATION MEMBER FUNCTIONS
  576. #pragma segment Application
  577. void TGUIApplication::DoCreateDocument()
  578. // Create initially one window.
  579. {
  580.     TWindow * aWindow = new TWindow;
  581.     ASSERT(aWindow != NULL, "\pWe didn't create a TWindow");
  582.     
  583.     if(aWindow != NULL)
  584.         this->AddDocument(aWindow);
  585. }
  586.  
  587.  
  588. #pragma segment Application
  589. void TGUIApplication::AddDocument(TWindow* theDocument)
  590. // Add the document (Window) to an internal list of documents.
  591. {
  592.     fDocument = theDocument;
  593. }
  594.  
  595.  
  596. #pragma segment Application
  597. void TGUIApplication::DoCreateDocument(short windowID)
  598. // Create initially one window.
  599. {
  600.     TWindow * aWindow = new TWindow(windowID);
  601.     ASSERT(aWindow != NULL, "\pWe didn't create a TWindow");
  602.  
  603.     if(aWindow != NULL)
  604.         this->AddDocument(aWindow);
  605. }
  606.  
  607.  
  608. #pragma segment Application
  609. void TGUIApplication::Draw()
  610. // Define drawing instructions inside this method. Default dispatch
  611. // and draw the currently active document (window).
  612. {
  613.     fDocument->Draw();
  614. }
  615.  
  616.  
  617. #pragma segment Application
  618. void TGUIApplication::DoClick()
  619. // Handle a click inside a window, empty for the moment (need to override this one)
  620. {
  621. }
  622.  
  623.  
  624. #pragma segment Application
  625. void TGUIApplication::DoAboutBox()
  626. // Present our default about box, override for a better one!
  627. {
  628.     ASSERT(false, "\pThis is the Gamura framework! Override for a better about box");
  629. }
  630.  
  631.  
  632. #pragma segment Application
  633. void TGUIApplication::DoHelp()
  634. // This is the hook for a possible help system (something outside the help balloons)
  635. {
  636.     ASSERT(false, "\pYou triggered the help system, override for a real one!");
  637. }
  638.  
  639.  
  640. // _________________________________________________________________________________________________________ //
  641. // TQTApplication class member function implementations
  642.  
  643. //    CONSTRUCTORS & DESTRUCTORS
  644.  
  645. #pragma segment Application 
  646. TQTApplication::TQTApplication()
  647. // Initialize the QT specific parts.
  648. {
  649. }
  650.  
  651.  
  652. #pragma segment Application 
  653. TQTApplication::~TQTApplication()
  654. // Do any possible epilogue cleanup.
  655. {
  656. }
  657.  
  658.  
  659. // _________________________________________________________________________________________________________ //
  660. // TGXApplication class member function implementations
  661.  
  662. //    CONSTRUCTORS & DESTRUCTORS
  663.  
  664. #pragma segment Application 
  665. TGXApplication::TGXApplication()
  666. // Initialize the GX specific parts
  667. {
  668. }
  669.  
  670.  
  671. #pragma segment Application 
  672. TGXApplication::~TGXApplication()
  673. // Do any possible epilogue cleanup.
  674. {
  675. }
  676.  
  677.  
  678. // _________________________________________________________________________________________________________ //
  679. // TQTAndGXApplication class member function implementations
  680.  
  681. //    CONSTRUCTORS & DESTRUCTORS
  682.  
  683. #pragma segment Application 
  684. TQTAndGXApplication::TQTAndGXApplication()
  685. // Initialize the QT and GX specific parts.
  686. {
  687. }
  688.  
  689.  
  690. #pragma segment Application 
  691. TQTAndGXApplication::~TQTAndGXApplication()
  692. // Do any possible epilogue cleanup.
  693. {
  694. }
  695.  
  696.  
  697. // _________________________________________________________________________________________________________ //
  698.  
  699.  
  700. /*    Change History (most recent last):
  701.   No        Init.    Date        Comment
  702.   1        khs    11/6/92    New file
  703.   2        khs    1/14/93    Cleanup
  704. */
  705.  
  706.